/*
 * version 0.1
 * coded by yuanly. 2011-7-12
 * 配合easyweb开发框架使用。仿照dwr，让javascript直接调用java函数。
 * 需要依赖jquery进行ajax通信。
 * 
 * Server.url : 服务器的url。即host:port/application/servlet
 * Object = Server.create(path) : 提供一个全路径的类名作为参数，返回一个与服务端对象关联的对象。
 * Object.call(var...) : 调用对象的方法，第一个参数是方法名，后面是被调用方法的参数。
 * Object.asynCall(var ...) : 异步方式调用对象的方法，最后一个参数为callback函数。
 * Object.fakeCall(var ...) : 伪调用， 只返回构造好的options（表示为对象的http参数），方便用户使用自己的方式进行通信。
 * 
 * example：
 * Server.url="/poi/conflict";
 * a = Server.create("bcms.base.dao.IGisConflict");
 * retObj = a.call("getGisConflictsByCity","GZ",0,11);
 */
 
if(!this.JSON){
	document.write('<script src="../js/json.js" type=text/javascript></script>');
}
var Server={};
Server.url="/tc/easyweb";
Server.create=function(path){
	Caller = function(path){
		/*javascript自带的JSON转换会在转换字符串类型时在结果加上双引号。这里把它去掉*/
		this.toJson = function(arg){
			var json = JSON.stringify(arg);
			if(typeof(arg) == "string"){
				return json.substring(1,json.length-1);
			}else{
				return json;
			}
		}
		this.getOptions = function(args){
			var str = '{"class":"'+path+'","method":"'+args[0]+'"';
			for(i=1;i<args.length;i++){
				str += ',"arg'+(i-1)+'":"'+encodeURI(this.toJson(args[i]))+'"';
			}
			str +='}';
			eval('var options= '+str);
			return options;
		}
		/*同步调用,method arg0 arg1...*/
		this.call = function(){
			if(1 > arguments.length){
				alert("必须提供<method>参数");
				return;
			}
			return post(this.getOptions(arguments));
		}
		/*异步调用,method arg0 arg1... callback*/
		this.asynCall = function(){
			if(2 > arguments.length){
				alert("必须提供<method>参数和回调函数");
				return;
			}
			var callback = arguments[arguments.length-1];
			var Options = this.getOptions(arguments.slice(0,arguments.length-1));
			$.ajaxSetup({async:true});
			$.post(Server.url,options,callback);
		}
		/*伪调用，只返回构造好的options，方便用户使用自己的方式进行通信。*/
		this.fakeCall = function(){
			if(1 > arguments.length){
				alert("必须提供<method>参数");
				return;
			}
			return this.getOptions(arguments);
		}
	}
	function post(options){
		var result;	
		$.ajaxSetup({async:false});
		//$.post(Server.url,options,function(data){
				//result = JsonParse(data);
		//		result=data;
		//	},"xml");
	    $.ajax({
		  url: Server.url,
		  dataType:"xml",
		  data:	options,
		  type:"post",	  
		  success: function(data){
		    result=data;
		  }
		});
		return result;
	}
	function JsonParse(str){
		try{
			return JSON.parse(str);
		}catch(e){
			return null;
		}
	}
	return new Caller(path);
}